
package modelos;

import conexion.CRUD;
import conexion.Conexion;
import enumeraciones.eFacultad;
import global.DatosGlobales;
import interfaces.modelo;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;



public class Profesor implements modelo{
    
    public static String TABLA = "profesores";
    public static String SP = "SP_profesores";
    
    private Integer idProfesor;
    public static final String PROP_IDPROFESOR = "idProfesor";
    
    private String nombre;
    public static final String PROP_NOMBRE = "nombre";
    
    private String apellidos;
    public static final String PROP_APELLIDOS = "apellidos";
    
    private String telefono;
    public static final String PROP_TELEFONO = "telefono";
    
        private eFacultad facultad;
    public static final String PROP_FACULTAD = "facultad";

    /**
     * Get the value of facultad
     *
     * @return the value of facultad
     */
    public eFacultad getFacultad() {
        return facultad;
    }

    /**
     * Set the value of facultad
     *
     * @param facultad new value of facultad
     */
    public void setFacultad(eFacultad facultad) {
        eFacultad oldFacultad = this.facultad;
        this.facultad = facultad;
        propertyChangeSupport.firePropertyChange(PROP_FACULTAD, oldFacultad, facultad);
    }

    
    private Boolean nuevo = Boolean.TRUE;

    public Profesor() {
        idProfesor= 0;
    }

    public Profesor(Integer idProfesor, String nombre, String apellidos, String telefono) {
        this.idProfesor = idProfesor;
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.telefono = telefono;
    }
    

    public String getTelefono() {
        return telefono;
    }


    public void setTelefono(String telefono) {
        String oldTelefono = this.telefono;
        this.telefono = telefono;
        propertyChangeSupport.firePropertyChange(PROP_TELEFONO, oldTelefono, telefono);
    }



    public String getApellidos() {
        return apellidos;
    }

    /**
     * Set the value of apellidos
     *
     * @param apellidos new value of apellidos
     */
    public void setApellidos(String apellidos) {
        String oldApellidos = this.apellidos;
        this.apellidos = apellidos;
        propertyChangeSupport.firePropertyChange(PROP_APELLIDOS, oldApellidos, apellidos);
    }

    

    /**
     * Get the value of nombre
     *
     * @return the value of nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * Set the value of nombre
     *
     * @param nombre new value of nombre
     */
    public void setNombre(String nombre) {
        String oldNombre = this.nombre;
        this.nombre = nombre;
        propertyChangeSupport.firePropertyChange(PROP_NOMBRE, oldNombre, nombre);
    }


    /**
     * Get the value of idProfesor
     *
     * @return the value of idProfesor
     */
    public Integer getIdProfesor() {
        return idProfesor;
    }

    /**
     * Set the value of idProfesor
     *
     * @param idProfesor new value of idProfesor
     */
    public void setIdProfesor(Integer idProfesor) {
        Integer oldIdProfesor = this.idProfesor;
        this.idProfesor = idProfesor;
        propertyChangeSupport.firePropertyChange(PROP_IDPROFESOR, oldIdProfesor, idProfesor);
    }
    private transient final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this);

    /**
     * Add PropertyChangeListener.
     *
     * @param listener
     */
    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }

    /**
     * Remove PropertyChangeListener.
     *
     * @param listener
     */
    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }

    @Override
    public void guardar() {
          try{
        Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521, DatosGlobales.getInstance().getServicio());
        String proc = "begin "+Profesor.SP+"(?,?,?,?,?,?); end;";
        CallableStatement prepareCall = con.getConexionOracle().prepareCall(proc);
        int i =1;
        if(getNuevo()){
            prepareCall.setInt(i++, CRUD.Insert.getOpcion());
        }else{
            prepareCall.setInt(i++, CRUD.Update.getOpcion());
        }
        prepareCall.setInt(i++, this.getIdProfesor());
        prepareCall.setString(i++, this.getNombre());
        prepareCall.setString(i++, this.apellidos);
        prepareCall.setString(i++, this.getTelefono());
        prepareCall.setInt(i++, this.getFacultad().getIdFacultad());
        prepareCall.execute();
        }catch(Exception ex){
            System.out.println("Excepcion" + ex);
        }
    }

    @Override
    public void eliminar() {
       try{
        Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521, DatosGlobales.getInstance().getServicio());
        String proc = "begin "+Profesor.SP+"(?,?,?,?,?,?); end;";
        CallableStatement prepareCall = con.getConexionOracle().prepareCall(proc);
        int i =1;
        prepareCall.setInt(i++, CRUD.Delete.getOpcion());
        prepareCall.setInt(i++, this.getIdProfesor());
        prepareCall.setString(i++, this.getNombre());
        prepareCall.setString(i++, this.apellidos);
        prepareCall.setString(i++, this.getTelefono());
        prepareCall.setInt(i++, this.getFacultad().getIdFacultad());
        prepareCall.execute();
        }catch(Exception ex){
            System.out.println("Excepcion" + ex);
        }
    }
    
    public static List<Profesor> getProfesores(String where){
        List<Profesor> result = new ArrayList<Profesor>();
         try {
            Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521,  DatosGlobales.getInstance().getServicio());
            ResultSet rs = con.getConexionOracle().createStatement().executeQuery("select * from "+Profesor.TABLA);
            while (rs.next()) {
                result.add(Profesor.makeProfesor(rs));
            }

        } catch (SQLException ex) {
            System.out.println("Excepcion" + ex);
        }
        return result;
    }
    
    public static Profesor getProfesorById(Integer id){
         Profesor result = new Profesor();
         try {
            Conexion con = new Conexion("Conexion", DatosGlobales.getInstance().getIpGeneral(), "minisega", "MS", 1521,  DatosGlobales.getInstance().getServicio());
            ResultSet rs = con.getConexionOracle().createStatement().executeQuery("select * from "+Profesor.TABLA);
            while (rs.next()) { 
                result = Profesor.makeProfesor(rs);
            }

        } catch (SQLException ex) {
            System.out.println("Excepcion" + ex);
        }
        return result;
    }
    
    private static Profesor makeProfesor(ResultSet rs) throws SQLException{
        Profesor result = null;
                int i =1;
                Integer idProfesor = rs.getInt(i++);
                String nombre = rs.getString(i++);
                String apellidos = rs.getString(i++);
                String telefono = rs.getString(i++);
                                
                result = new Profesor(idProfesor, nombre, apellidos, telefono);
               
                result.setNuevo(Boolean.FALSE);
        return result;
    }
    
    @Override
    public String toString(){
        return ""+getNombre();
    }

    /**
     * @return the nuevo
     */
    public Boolean getNuevo() {
        return nuevo;
    }

    /**
     * @param nuevo the nuevo to set
     */
    public void setNuevo(Boolean nuevo) {
        this.nuevo = nuevo;
    }

    
}
